package core

import (
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
	"github.com/kataras/iris/v12/core/router"
	"github.com/kataras/iris/v12/mvc"
	"huanteng/web/global/application"
	"reflect"
)



var API router.Party

func ReflexRegister(controller interface{},funcName string,services ...interface{}) func(ctx iris.Context) {
	return func (ctx iris.Context)  {

		args := []reflect.Value{ reflect.ValueOf(ctx) } //构造一个类型为reflect.Value的切片


    //  fmt.Println(reflect.ValueOf(services))
	//	fmt.Println(reflect.TypeOf(services))
		//fmt.Println( reflect.ValueOf(services))


		v:=reflect.ValueOf(controller)


	//	fmt.Println(v.Elem())
		//elem:=v.Elem()
		//elem.FieldByName("Service").Set(reflect.TypeOf(services))
		//field1:=v.Type().Field(0)
		//v.FieldByName(field1.Name).Set(reflect.ValueOf(provider.NewRoleService))
		fun:=v.MethodByName(funcName)
		//_=fun.Call(args)
		result :=  fun.Call(args)
		//return "xxx"//result[0].Interface()
		if result!=nil{
			//获取返回参数的值fmt.Println(result[0].Interface())
		ctx.JSON(result[0].Interface())
		}
		ctx.Next()
	}
}
func Party(name string) router.Party {
	API=application.App.Party(name)
	return API
}

 var MvcError =func(ctx iris.Context, err error) {
	//对于所有控制器，如果控制器包含HandleError（ctx iris.Context，err error）函数，则可以选择按每个控制器覆盖它。


		ctx.HTML(fmt.Sprintf("<b>%s</b>", err.Error()))
	}


func Register(name string,controller interface{},services ...interface{} )  {

	if len(services)<1{
		mvc.New(API.Party(name)).Handle(controller)//.HandleError(MvcError)
	}else{
	mvc.Configure(API.Party(name), func(app *mvc.Application) {
		app.Register(services ...)
		app.Handle(controller)
	})}

}

func Middleware(middleware ...context.Handler)  {
	API.Use(middleware ...)  //需要三个点来达到多参数目的
}
